package com.gushen.library.filter;

import android.content.Context;
import android.opengl.GLES20;
import com.gushen.library.utils.OpenGLUtils;


/**
 * FBO
 */
public class AbstractFrameFilter extends AbstractFilter {
    //FBO id
    protected int[] mFrameBuffers;
    //fbo 纹理id
    protected int[] mFrameBufferTextures;

    public AbstractFrameFilter(Context context, String vertexShaderId, String fragmentShaderId) {
        super(context, vertexShaderId, fragmentShaderId);
    }

    @Override
    public void onReady(int width, int height) {
        super.onReady(width, height);
        //如果mFrameBuffers不为空，则调用destroyFrameBuffers方法销毁之前的FBO资源，这是为了避免资源泄露。
        if (mFrameBuffers != null) {
            destroyFrameBuffers();
        }
        //fbo的创建 (缓存)
        //1、创建fbo （离屏屏幕）
        mFrameBuffers = new int[1];
        //函数用于生成FBO的ID，并将其存储在mFrameBuffers数组中。这里只创建了一个FBO。
        // 1、创建几个fbo 2、保存fbo id的数据 3、从这个数组的第几个开始保存
        GLES20.glGenFramebuffers(mFrameBuffers.length,mFrameBuffers,0);

        //2、创建属于fbo的纹理
        mFrameBufferTextures = new int[1]; //用来记录纹理id
        //创建纹理
        OpenGLUtils.glGenTextures(mFrameBufferTextures);


        //让fbo与 纹理发生关系
        //创建一个 2d的图像
        // 目标 2d纹理+等级 + 格式 +宽、高+ 格式 + 数据类型(byte) + 像素数据
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,mFrameBufferTextures[0]);
        //使用GLES20.glTexImage2D函数为这个纹理分配内存。这里指定了纹理的宽度为mOutputWidth，高度为mOutputHeight，格式为GL_RGBA。
        GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D,0, GLES20.GL_RGBA,mOutputWidth,mOutputHeight,
                0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null);


        // 让fbo与纹理绑定起来 ， 后续的操作就是在操作fbo与这个纹理上了
        //通过GLES20.glBindFramebuffer函数将FBO绑定到GL_FRAMEBUFFER目标上，
        // 并使用GLES20.glFramebufferTexture2D函数将之前创建的纹理附加到FBO的颜色附件点上。这样，后续的渲染操作就会输出到这个纹理中。
        GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER,mFrameBuffers[0]);
        GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0,
                GLES20.GL_TEXTURE_2D, mFrameBufferTextures[0], 0);

        //解绑
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,0);
        GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER,0);
    }

    public void destroyFrameBuffers() {
        //删除fbo的纹理
        if (mFrameBufferTextures != null) {
            GLES20.glDeleteTextures(1, mFrameBufferTextures, 0);
            mFrameBufferTextures = null;
        }
        //删除fbo
        if (mFrameBuffers != null) {
            GLES20.glDeleteFramebuffers(1, mFrameBuffers, 0);
            mFrameBuffers = null;
        }
    }


    @Override
    protected void initCoordinate() {
        if (mGLTextureBuffer != null){
            mGLTextureBuffer.clear();
            //从opengl画到opengl 不是画到屏幕， 修改坐标
            float[] TEXTURE = {
                    0.0f, 0.0f,
                    1.0f, 0.0f,
                    0.0f, 1.0f,
                    1.0f, 1.0f
            };
            mGLTextureBuffer.put(TEXTURE);
        }
    }


    @Override
    public void release() {
        super.release();
        destroyFrameBuffers();
    }

}
